/**
 * @description 管理员的路由 API 接口
 * @description Administrator's routing API interface
 */

const Router = require('koa-router')

const {
  RegisterValidator,
  AdminLoginValidator,
  PositiveIdParamsValidator
} = require('@validators/admin')

const { AdminDao } = require('@dao/admin');
const { Auth } = require('@middlewares/auth');
const { LoginManager } = require('@service/login');
const { Resolve } = require('@lib/helper');
const res = new Resolve();

const AUTH_ADMIN = 16;

const router = new Router({
  prefix: '/api/v1/admin'
})

// 管理员注册
router.post('/register', async (ctx) => {
  // 通过验证器校验参数是否通过
  const v = await new RegisterValidator().validate(ctx);

  // 创建管理员
  const [err, data] = await AdminDao.create({
    email: v.get('body.email'),
    password: v.get('body.password2'),
    nickname: v.get('body.nickname'),
    residence: v.get('body.residence'),
    qq: v.get('body.qq'),
    wechat: v.get('body.wechat'),
    blog: v.get('body.blog'),
    career: v.get('body.career')
  });

  if (!err) {
    // 返回结果
    ctx.response.status = 200;
    ctx.body = res.json(data);

  } else {
    ctx.body = res.fail(err);
  }
})

// 管理登录
router.post('/login', async (ctx) => {
  const v = await new AdminLoginValidator().validate(ctx);

  const [err, token] = await LoginManager.adminLogin({
    email: v.get('body.email'),
    password: v.get('body.password')
  })

  if (!err) {
    ctx.response.status = 200;
    ctx.body = res.json({ token });
  } else {
    ctx.body = res.fail(err, err.msg);
  }
});

// 获取用户信息
router.get('/auth', new Auth(AUTH_ADMIN).m, async (ctx) => {
  // 获取用户ID
  const id = ctx.auth.uid;

  // 查询用户信息
  let [err, data] = await AdminDao.detail(id);

  if (!err) {
    // 返回结果
    ctx.response.status = 200;
    ctx.body = res.json(data)
  } else {
    ctx.body = res.fail(err)
  }
})

// 获取管理员用户信息
// 需要管理员及以上才能操作
router.get('/detail/:id', new Auth(AUTH_ADMIN).m, async (ctx) => {
  // 获取用户ID
  const v = await new PositiveIdParamsValidator().validate(ctx);
  const id = v.get('path.id');
  // 查询用户信息
  let [err, data] = await AdminDao.detail(id);
  if (!err) {
    ctx.response.status = 200;
    ctx.body = res.json(data)
  } else {
    ctx.body = res.fail(err)
  }
})

// 删除管理员用户
// 需要管理员才能操作
router.delete('/delete/:id', new Auth(AUTH_ADMIN).m, async (ctx) => {
  // 通过验证器校验参数是否通过
  const v = await new PositiveIdParamsValidator().validate(ctx);

  // 获取用户ID参数
  const id = v.get('path.id');
  // 删除用户
  const [err, data] = await AdminDao.destroy(id);
  if (!err) {
    ctx.response.status = 200;
    ctx.body = res.success('删除用户成功');
  } else {
    ctx.body = res.fail(err);
  }
})


// 获取更新管理员信息
// 需要管理员及以上才能操作
router.put('/update/:id', new Auth(AUTH_ADMIN).m, async (ctx) => {
  // 通过验证器校验参数是否通过
  const v = await new PositiveIdParamsValidator().validate(ctx);

  // 获取用户ID参数
  const id = v.get('path.id');
  // 删除用户
  const [err, data] = await AdminDao.update(id, v);
  if (!err) {
    ctx.response.status = 200;
    ctx.body = res.success('更新管理员信息成功');
  } else {
    ctx.body = res.fail(err);
  }
})

module.exports = router
